#ifndef _VIDEO_FRAME_OBSERVABLE_
#define _VIDEO_FRAME_OBSERVABLE_

#include "cv.h"
#include "Observer.h"
#include <vector>
#include "HandFinder.h"

#define BLOCK_SIZE 8
#define SBLOCK_SIZE BLOCK_SIZE*BLOCK_SIZE

using namespace std;

///Класс
class VideoFrameObservable: public Observable
{
private:
	int m_width; ///< Ширина кадра
	int m_height; ///< Высота кадра

	int m_nchannels; ///<Число каналов
	int m_step; ///<Размер изображения

	uchar *m_data; ///<Данные
	uchar *m_YCrCb; ///<Данные

	int m_cursor_x, m_cursor_y;

	int m_pointRed, m_pointGreen, m_pointBlue;

	bool m_calibrated;

	uchar m_fingerY, m_fingerCb, m_fingerCr;


	HandFinder *m_virtCur;


private:
	bool checkPixel(int _x, int _y);
	void moveCursor();
	void DrawPoint(int _x, int _y, int _r);
	void releaseform_block(double data[BLOCK_SIZE][BLOCK_SIZE],double iquantable[BLOCK_SIZE][BLOCK_SIZE]);
	void transform_block(double data[BLOCK_SIZE][BLOCK_SIZE],double quantable[BLOCK_SIZE][BLOCK_SIZE]);
	void d1idct(double data[BLOCK_SIZE]);
	void d1dct(double data[BLOCK_SIZE]);
	void set_pointBGR(int channel, int x, int y, double val);


public:
	///Конструктор
	VideoFrameObservable(IplImage* _frame);

	double get_pointYCbCr(int _channel, int _x, int _y);

	///Задает фрейм для обработки
	void setFrame(IplImage* _frame);

	void reduce();
	void reduce(int w, int h);

	void calibrate();
	bool isCalibrated();

	void DrawMarkers();

	uchar get_fY();
	uchar get_fCb();
	uchar get_fCr();

	~VideoFrameObservable();
};


#endif //_VIDEO_FRAME_OBSERVABLE_
